package com.qijia.common.security;

import org.apache.log4j.Logger;  
import java.io.IOException;  
import javax.servlet.Filter;  
import javax.servlet.FilterChain;  
import javax.servlet.FilterConfig;  
import javax.servlet.ServletException;  
import javax.servlet.ServletRequest;  
import javax.servlet.ServletResponse;  

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.SecurityMetadataSource;  
import org.springframework.security.access.intercept.AbstractSecurityInterceptor;  
import org.springframework.security.access.intercept.InterceptorStatusToken;  
import org.springframework.security.web.FilterInvocation;  
import org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource;  

public class FilterSecurityInterceptor extends AbstractSecurityInterceptor implements Filter {  
    /** 
     * Logger for this class 
     */  
    private static final Logger logger = Logger.getLogger(FilterSecurityInterceptor.class);  
    
    private FilterInvocationSecurityMetadataSource securityMetadataSource;  
    
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {  
        if (logger.isDebugEnabled()) {  
            logger.debug("doFilter(ServletRequest, ServletResponse, FilterChain) - start"); //$NON-NLS-1$  
        }  
        System.out.println("start do filter");
        FilterInvocation fi = new FilterInvocation(request, response, chain);  
        invoke(fi);  
        System.out.println("end do filter");
        if (logger.isDebugEnabled()) {  
            logger.debug("doFilter(ServletRequest, ServletResponse, FilterChain) - end"); //$NON-NLS-1$  
        }  
    }  
    public FilterInvocationSecurityMetadataSource getSecurityMetadataSource() {  
        return this.securityMetadataSource;  
    }  
    public Class<? extends Object> getSecureObjectClass() {  
        return FilterInvocation.class;  
    }  
    public void invoke(FilterInvocation fi) throws IOException, ServletException {  
        InterceptorStatusToken token = super.beforeInvocation(fi);  
		try {
			fi.getChain().doFilter(fi.getRequest(), fi.getResponse());
		} finally {
			super.afterInvocation(token, null);
		}
    }  
    @Override  
    public SecurityMetadataSource obtainSecurityMetadataSource() {  
        return this.securityMetadataSource;  
    }  
    public void setSecurityMetadataSource(FilterInvocationSecurityMetadataSource securityMetadataSource) {  
        this.securityMetadataSource = securityMetadataSource;  
    }  
    public void destroy() {  
        // TODO Auto-generated method stub  
    }  
    public void init(FilterConfig filterconfig) throws ServletException {  
        // TODO Auto-generated method stub  
    }  
}
